package com.example.demo.moduel.config;

import com.example.demo.moduel.service.StudentService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;



/*1.首先当我们要自定义Spring Security的时候我们需要继承自WebSecurityConfigurerAdapter来完成，相关配置重写对应 方法即可。
2.我们在这里注册CustomUserService的Bean，然后通过重写configure方法添加我们自定义的认证方式。
3.在configure(HttpSecurity http)方法中，我们设置了登录页面，而且登录页面任何人都可以访问，然后设置了登录失败地址，也设置了
注销请求，注销请求也是任何人都可以访问的。
4.permitAll表示该请求任何人都可以访问，.anyRequest().authenticated(),表示其他的请求都必须要有权限认证。
5.这里我们可以通过匹配器来匹配路径，比如antMatchers方法，假设我要管理员才可以访问admin文件夹下的内容，我可以这样来
写：.antMatchers("/admin/**").hasRole("ROLE_ADMIN")，也可以设置admin文件夹下的文件可以有多个角色来访问，写法如
下：.antMatchers("/admin/**").hasAnyRole("ROLE_ADMIN","ROLE_USER")
6.可以通过hasIpAddress来指定某一个ip可以访问该资源,假设只允许访问ip为210.210.210.210的请求获取admin下的资源，写法
如下.antMatchers("/admin/**").hasIpAddress("210.210.210.210")*/


@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
       @Bean
       UserDetailsService studentUserService() {
              return new StudentService();
       }

       @Bean
       public static NoOpPasswordEncoder passwordEncoder() {
              return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
       }

       @Override
       protected void configure(AuthenticationManagerBuilder auth) throws Exception {
              auth.userDetailsService(studentUserService());
       }

       @Override
       protected void configure(HttpSecurity http) throws Exception {
              http.authorizeRequests()
                      .anyRequest().authenticated()
                      .and().formLogin().loginPage("/login").failureUrl("/login?error").permitAll()
                      .and()
                      .logout()
                      .permitAll();
                      /*.and().formLogin().loginPage("/login")
                      //设置默认登录成功跳转页面
                      .defaultSuccessUrl("/index").failureUrl("/login?error").permitAll()
                      .and()
                      //开启cookie保存用户数据
                      .rememberMe()
                      //设置cookie有效期
                      .tokenValiditySeconds(60 * 60 * 24 * 7)
                      //设置cookie的私钥
                      .key("12345")
                      .and()
                      .logout()
                      //默认注销行为为logout，可以通过下面的方式来修改
                      .logoutUrl("/custom-logout")
                      //设置注销成功后跳转页面，默认是跳转到登录页面
                      .logoutSuccessUrl("/login")
                      .permitAll();*/
       }
}
